Java final 与 C++ const
全部标签 在努力实现const正确性的同时,我经常发现自己编写了这样的代码classBar;classFoo{public:constBar*bar()const{/*codethatgetsaBarsomewhere*/}Bar*bar(){returnconst_cast(static_cast(this)->bar());}};用于许多方法,例如bar()。编写这些手动调用常量方法的非常量方法是乏味的;此外,我觉得我在重复自己——这让我感觉很糟糕。我可以做些什么来减轻这个任务?(不允许使用宏和代码生成器。)编辑:除了litb的解决方案外,我也喜欢我自己的解决方案。:)
这个问题在这里已经有了答案:Defaultconstructorwithemptybrackets(9个回答)关闭7年前。正在处理this问题,我发现了一个不一致的行为。为什么引用绑定(bind)在构造函数中的行为与普通函数不同?structA{};structB:publicA{B(){}private:B(constB&);};voidf(constB&b){}intmain(){Aa(B());//worksAconst&a2=B();//C++0x:works,C++03:failsf(B());//C++0x:works,C++03:fails}我已经在严格的C++03模式下
当T是double(float)const当我尝试使用function时出现此错误.implicitinstantiationofundefinedtemplate'std::function'但是当T时就可以了是double(float).我尝试使用std::remove_cv::type删除这个const,但这不起作用。是的,我有#include.所以我的主要问题是:如何解决这个问题并删除const这样我就可以将此函数类型放入std::function.?我在使用operator()时遇到了这个问题lambda的方法,但我认为这个问题通常是关于任何方法类型的,而不仅仅是针对lamb
我不确定是否完全理解类方法中使用的const关键字背后的哲学。我一直认为在类方法的签名中使用const关键字意味着该方法不会修改其调用对象的字段。然而,当我们使用例如vector时,运算符[]的重载不是const:whateverT&vector::operator[](size_tpos)无论您如何处理给定的引用,它都不会对vector的字段执行任何修改,即使引用项已修改也是如此。另一个例子:templateclassArray{T*_items;T&operator[](size_tpos)const{return_items[pos];}}我可以在这里使用const关键字,因为_
std::set的描述容器givenbycppreference.com最后包含此注释:Themembertypesiteratorandconst_iteratormaybealiasestothesametype.Sinceiteratorisconvertibletoconst_iterator,const_iteratorshouldbeusedinfunctionparameterliststoavoidviolationsoftheOneDefinitionRule.我不明白最后这句话。我的理解是一个集合不允许修改它的元素(如果你需要改变一个,你必须erase它然后inse
我试图阻止对我正在编写的类的默认构造函数的访问。我希望其他人使用的构造函数需要对另一个对象的const引用。我已将默认构造函数设为私有(private)以防止其他人使用它。我收到默认构造函数的编译器错误,因为const引用成员变量未正确初始化。我该怎么做才能编译?classCFoo{public:CFoo();~CFoo();};classCBar{public:CBar(constCFoo&foo):fooReference(foo){}~CBar();private:constCFoo&fooReference;CBar()//Iamgettingacompilererrorbec
我想问一个关于方法的常量正确性的问题。让我来说明一下情况。classMyClass{public:...voidDiscussedMethod(){otherClass->NonConstMethod();}private:OtherClass*otherClass;};我有一个类MyClass,它保留了一个指向OtherClass的指针。在DiscussedMethod中,它调用OtherClass::NonConstMethod修改一些可见数据。我想知道,使DiscussedMethodconst是否是一个好习惯(因为它不修改任何成员数据)?这会是一种不好的做法吗?还是两者都好?如
我知道了charszA[]="abc";使用“abc”初始化数组szA,所以存放在栈内存中,函数结束时销毁。另一方面,考虑:char*szB="abc";这里的“abc”像静态变量一样存放在数据内存段,szB只是它的一个地址。在这一点上,我很奇怪:如果我尝试inti=0;while(i++这会在数据部分产生1000000个“hello”吗?为了解决这个问题,我编写了测试代码:#includeusingnamespacestd;char*testA(char*arr){returnarr;}char*testB(char*arr){returnarr;}voidmain(){cout结果
我将用代码说明我的问题:#includevoidPrintInt(constunsignedchar*&ptr){intdata=0;::memcpy(&data,ptr,sizeof(data));//advancethepointerreference.ptr+=sizeof(data);std::cout当我运行此代码(在VS2008中)时,我得到以下信息:错误C2664:“PrintInt”:无法将参数1从“unsignedchar*”转换为“constunsignedchar*&”。如果我取消注释“const”注释,它就可以正常工作。但是,指针不应该隐式转换为const指针,
我知道在使用C++和STL时,使用vector是存储二进制数据的好方法。但是,对于我的单元测试,我想使用constchar*C字符串变量来初始化vector。我正在尝试使用此处找到的代码变体-Converting(void*)tostd::vector-这样做:constchar*testdata="thequickbrownfoxjumpsoverthelazydog.";unsignedchar*buffer=(unsignedchar*)testdata;typedefvectorbufferType;bufferType::size_typesize=strlen((const